#include "Times.h"
#include "Lahan.h"
#include "tanaman.h"
#include "Aqua.h"
#include "Bolt.h"
#include "Clash.h"
#include "classinventory.h"
#include <cstdlib>
#include <iostream>
using namespace std;

//constructor
    Tanaman::Tanaman(){
        HappyMeter = 0;
    }
//copy constructor
    Tanaman::Tanaman(const Tanaman &T){
        HappyMeter = T.HappyMeter;
        TitikDewasa = T.TitikDewasa;
        TitikPanen = T.TitikPanen;
        Age = T.Age;
        NHarvested = T.NHarvested;
        Musimable = T.Musimable;
    }
//destruktor
    Tanaman::~Tanaman(){}

    void Tanaman::SetHappyMeter(int HP){
/*   SetHappyMeter
        Mengakses class Lahan
        diakses oleh class Time
        Bertambah jika status berupa ‘Watered’ pada pergantian hari
        "Berkurang jika dipanen (fungsi Harvested)" -> ini digabung ke void harvested aja mendingan
*/
        //kalau HappyMeter sudah sama dengan TitikPanen maka tidak melakukan apa-apa
        if (HappyMeter < TitikPanen)
        { HappyMeter = HappyMeter + HP;
            if ((HappyMeter >= TitikDewasa) && (HappyMeter < TitikPanen))
            { L.setStatus(Position.x, Position.y, 5);}
            if (HappyMeter >= TitikPanen)
            { L.setStatus(Position.x, Position.y, 7);}
        }
}


    void Tanaman::Harvested(){
/*   Harvested
        Mengakses class Lahan
        Mengurangi HappyMeter
        Mengakses class Inventory, karena menambah inventory player
        Mengurangi TitikPanen (penyelesaian bonus no.2)
*/
        if (NHarvested == -999){
            L.deleteTanaman(Position.x, Position.y);
        }
        else
        {
            NHarvested = NHarvested + 1;
            HappyMeter = TitikDewasa;
            if (TitikPanen - 5 >= TitikDewasa + 5)
            {
                TitikPanen -= 5;
            }
            L.setStatus(Position.x, Position.y, 5);
        }
    }
    
    void Tanaman::DecAge(){
/*   DecAge
        diakses class Time tiap pergantian hari
        Berkurang tiap pergantian hari
        Mengakses class Lahan
        Mengubah status Lahan menjadi ‘Dead’ Jika Age habis
*/
        Age = Age - 1;
        if (Age == 0){
            L.setStatus(Position.x , Position.y, 8);
            //set status lahan dengan posisi tanaman ini menjadi dead
        }
    }

    int Tanaman::CheckHappyMeter(){
/*   CheckHappyMeter
    Mengembalikan nilai HappyMeter dan status Panen dari tanaman
*/
        return HappyMeter;
    }

    int Tanaman::GetKodeTanaman(){
        return KodeTanaman;
    }

    int Tanaman::GetNHarvested(){
        return NHarvested;
    }

    int Tanaman::GetAge(){
        return Age;
    }

    int Tanaman::GetMusimable()
    {
        return Musimable;
    }
    
    void Tanaman::SetAge(int age){
        Age = age;
    }

    int Tanaman::GetTitikPanen()
    {
        return(TitikPanen);
    }

    void Tanaman::SetTitikPanen(int newTP)
    {
        TitikPanen = newTP;
    }

    void Tanaman::SetNHarvested(int newNH)
    {
        NHarvested = newNH;
    }

    ChronoPlant::ChronoPlant(int x,int y){
        Tanaman();
        TitikDewasa = 20;
        TitikPanen = 60;
        Age = 50;
        NHarvested = 0;
//        PriceBibit = 500;
//        PriceJual = 850;
        Musimable = 5;
        KodeTanaman = 9;
        Position.x = x;
        Position.y = y;
/* ngetes konstruktor
        cout << "Horee ChronoPlant terbentuk !" << endl;
        cout << "Happy meternya adalah : " << HappyMeter << endl;
        cout << "Titik dewasanya adalah : " << TitikDewasa << endl;
        cout << "Titik panennya adalah : " << TitikPanen << endl;
        cout << "Umurnya adalah : " << Age << endl;
        cout << "NHarvested nya adalah : " << NHarvested << endl;
        cout << "Harga bibitnya adalah : " << PriceBibit << endl;
        cout << "Harga jualnya adalah : " << PriceJual << endl;
        cout << "Tanaman ini bisa ditanam di musim : " << Musimable << endl;
*/
//        cout << "Posisi ChronoPlant adalah : (" << Position.x << "," << Position.y << ")" << endl;
    }

    ChronoPlant::~ChronoPlant(){}
    
    void ChronoPlant::EatEffect(){
    
// EatEffect : mengurangi waktu global (Time) sebanyak 20 satuan waktu.
        T.SetClock(T.GetClock() - 20);
        cout << "Waktu berkurang sebanyak 20 satuan." << endl;
    }
/* Untuk show
    void ChronoPlant::Show(){
        cout << "Status ChronoPlant nya adalah :" << endl;
        cout << "Happy meternya adalah : " << HappyMeter << endl;
        cout << "Titik dewasanya adalah : " << TitikDewasa << endl;
        cout << "Titik panennya adalah : " << TitikPanen << endl;
        cout << "Umurnya adalah : " << Age << endl;
        cout << "NHarvested nya adalah : " << NHarvested << endl;
        cout << "Harga bibitnya adalah : " << PriceBibit << endl;
        cout << "Harga jualnya adalah : " << PriceJual << endl;
        cout << "Tanaman ini bisa ditanam di musim : " << Musimable << endl;
    }
*/
    ReynFruit::ReynFruit(int x,int y){
        Tanaman();
        TitikDewasa = 40;
        TitikPanen = 90;
        Age = 30;
        NHarvested = -999;
//        PriceBibit = 650;
//        PriceJual = 1100;
        Musimable = 6;
        KodeTanaman = 10;
        Position.x = x;
        Position.y = y;
    }

    ReynFruit::~ReynFruit(){}

    void ReynFruit::EatEffect() {
//EatEffect : memanggil hujan untuk keesokan harinya
        T.SetEvent(1);
        cout << "Tik...tik...tiktiktik...Hujaaan !" << endl;
    }

    Ichalmond::Ichalmond(int x,int y){
        Tanaman();
        TitikDewasa = 40;
        TitikPanen = 100;
        Age = 40;
        NHarvested = -999;
//        PriceBibit = 600;
//        PriceJual = 1000;
        Musimable = 1;
        KodeTanaman = 11;
        Position.x = x;
        Position.y = y;
    }

    Ichalmond::~Ichalmond(){}

    void Ichalmond::EatEffect() {
//EatEffect : mempercepat kinerja kurcaci yang sedang aktif
//pada saat buah ini dimakan sebanyak 10 satuan waktu
       int i;
       for (i=1; i<=10; i++)
         {  A.Move();
            B.Move();
            C.Move();
            L.PrintLahan();
         }
       cout << "Kurcaci bergerak sebanyak 10 kali." << endl;
    }
    
    Edondong::Edondong(int x,int y){
        Tanaman();
        TitikDewasa = 30;
        TitikPanen = 120;
        Age = 60;
        NHarvested = -999;
//        PriceBibit = 800;
//        PriceJual = 1300;
        Musimable = 5;
        KodeTanaman = 12;
        Position.x = x;
        Position.y = y;
    }

    Edondong::~Edondong(){}

    void Edondong::EatEffect(){
//EatEffect : menambah HappyMeter seluruh tanaman lain (kecuali Edondong) sejumlah 10 poin
        int i,j;
        for (i = 0; i <= 8; i++)
            {   for (j = 0; j <= 8; j++)
                    {   if ((L.getStatus(i,j) == 3)||(L.getStatus(i,j) == 4)||(L.getStatus(i,j) == 5)||(L.getStatus(i,j) == 6)||(L.getStatus(i,j) == 7)) //statusnya tertanam
                        { if (L.getTanaman(i,j).GetKodeTanaman() != 4) //kecuali Edondong (kode : 4)
                                {   L.getTanaman(i,j).SetHappyMeter(10); }
                        }
                    }
            }
        cout << "Semua Happy Meter tanaman (kecuali Edondong) bertambah sepuluh poin :)" << endl;
    }
    
    GreenAlgoe::GreenAlgoe(int x,int y){
        Tanaman();
        TitikDewasa = 30;
        TitikPanen = 100;
        Age = 50;
        NHarvested = 0;
//        PriceBibit = 700;
//        PriceJual = 950;
        Musimable = 3;
        KodeTanaman = 13;
        Position.x = x;
        Position.y = y;
    }

    GreenAlgoe::~GreenAlgoe(){}

    void GreenAlgoe::EatEffect(){
//EatEffect : menambah harga jual tiap tanaman hasil panen sebesar 20%, hanya berlaku untuk hari dimana GreenAlgoe dimakan
        I.MoreExpensive();
        cout << "Perhatian! Toko akan membeli hasil tanaman panen Anda sebesar 120% dari harga biasa hingga pergantian hari!" << endl;
    }

    Hanselnut::Hanselnut(int x,int y){
        Tanaman();
        TitikDewasa = 50;
        TitikPanen = 100;
        Age = 30;
        NHarvested = 0;
//        PriceBibit = 600;
//        PriceJual = 1000;
        Musimable = 6;
        KodeTanaman = 14;
        Position.x = x;
        Position.y = y;
    }

    Hanselnut::~Hanselnut(){}

    void Hanselnut::EatEffect() {
//EatEffect : mendapatkan bibit secara random dan memutar lagu Sm*sh (tapi dipanggil pada void Eat() dari player
        
        int a,b;
        a = rand()%8 + 1; //acak kode barang bibit
        b = rand() % 3; //acak amount max 3
        if (b == 0) { cout << "............." << endl;
       }
        else {  
                cout << "Mendapatkan bibit ";
                if (a == 1) { cout << "ChronoPlant ";}
                else if (a == 2) { cout << "ReynFruit ";}
                else if (a == 3) { cout << "Ichalmond ";}
                else if (a == 4) { cout << "Edondong ";}
                else if (a == 5) { cout << "GreenAlgoe ";}
                else if (a == 6) { cout << "Hanselnut ";}
                else if (a == 7) { cout << "AbelTree ";}
                else if (a == 8) { cout << "Elmonade ";}
                cout << "sebanyak " << b << " buah" << endl;
                I.InsertInventory(a,b);
            }
    }

    
    AbelTree::AbelTree(int x,int y){
        Tanaman();
        TitikDewasa = 30;
        TitikPanen = 100;
        Age = 30;
        NHarvested = 0;
//        PriceBibit = 1000;
//        PriceJual = 2500;
        Musimable = 4;
        KodeTanaman = 15;
        Position.x = x;
        Position.y = y;
    }

    AbelTree::~AbelTree(){}

    void AbelTree::EatEffect() {
//EatEffect : Diskon sebesar 50% pada hari Elmonade dimakan.
        I.Diskon50();
        cout << "Perhatian! Diskon sebesar 50% diadakan di toko hingga pergantian hari!" << endl;
    }

    Elmonade::Elmonade(int x,int y){
        Tanaman();
        TitikDewasa = 30;
        TitikPanen = 100;
        Age = 50;
        NHarvested = -999;
//        PriceBibit = 5000;
//        PriceJual = 5000;
        Musimable = 2;
        KodeTanaman = 16;
        Position.x = x;
        Position.y = y;
    }

    Elmonade::~Elmonade(){}

    void Elmonade::EatEffect() {
//Merandom EatEffect dari semua ditambah dengan tambahan opsi mendapat 25.000 Alabi
        int a;
        long int b;
//        srand((unsigned)time(0));
        a = rand()%8 + 1; //batas atas 8, batas bawah 1
//        srand(time(NULL));
        b = rand() % 150000;
        if (a == 1) {ChronoPlant::EatEffect();}
        else if (a == 2) {ReynFruit::EatEffect();}
        else if (a == 3) {Ichalmond::EatEffect();}
        else if (a == 4) {Edondong::EatEffect();}
        else if (a == 5) {GreenAlgoe::EatEffect();}
        else if (a == 6) {Hanselnut::EatEffect();}
        else if (a == 7) {AbelTree::EatEffect();}
        else if (a == 8) {I.ChangeMoney(b);
            cout << "Selamat! Anda mendapatkan uang sebanyak " << b << " Å" << endl;}
    }